package sourceTools;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.bj58.analysis.tools.etl.bean.ETLTrackBean;

/*
 *
 **************************************20150608 小娄切换SPM****************************************
 * 优先判断spm，如果spm不满足条件则还是按照原来的逻辑进行判断
 *
 * 1. 广告系列		= 来源域名为www.hao123.com的都是。
 *               或：落地页有utm_source，且utm_source参数值不包含sem-，email，edm的,且有spm或utm_campaign参数。
 *
 * 1.1 utm_source和 utm_campaign都有值时，使用utm_campaign去匹配代码标记1,如果匹配上则向上汇总；
 * 1.2 utm_source有值和 utm_campaign无值时，使用utm_source去匹配代码标记1,如果匹配上则向上汇总(针对hao123导航)；
 * 1.3 utm_source和 utm_campaign都无值时，判断域名是否为hao123.com，是则加入广告系列-hao123导航-hao123导航;
 * 1.4 否则，广告系列-其他-all
 *
 *
 * 2、SEM	= 落地页有utm_source参数，且utm_source参数值包含sem-的, 有来源域名，且来源域名包含
 *              （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou ,haosou ,360.com）
 *
 * 2.1 使用utm_source去匹配代码标记1(因为SEM的utm_campaign字段对分渠道统计无意义)。
 * 2.2 否则，SEM-其他-all
 *
 * 3. EDM      = 落地页有utm_source参数，（有或无）utm_medium参数，且utm_source与utm_medium参数任一中包含email,或edm
 * 4. SEO      = 落地页不包含utm_source参数，有来源域名，且来源域名包含
 *              （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou ,haosou ,360.com）
 * 5. 站外引荐       = 落地页不包含utm_source参数，有来源域名，来源域名不包含58.com，也不包含
 *                                   （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou ,haosou ,360.com）
 *		                      或：落地页包含utm_source参数，但不属于上面的SEM，EDM，商务广告的其他所有。
 * 6. 站内引荐       = 落地页不包含utm_source参数，有来源域名，且来源域名中包含58.com。
 * 7. 直接流量       = 落地页不包含utm_source参数，没有来源域名
 *
 *
 *
 */

public class TrackSourceType
{

	private static String getParameters(String strInfo, String strKey)
	{
		if (strInfo.contains(strKey)
				&& strInfo.indexOf(strKey) < (strInfo.length() - strKey.length()))
		{
			String strValue = strInfo.split(strKey)[1].trim();
			if (strValue.contains("&") && !strValue.endsWith("&"))
			{
				return strValue.split("&")[0].trim();
			}
			else
				return strValue;
		}
		else
			return null;
	}


	public static String getSource(String strUrl,String strDomain ,List<String> sourceNameList,List<String> marketSpmList,List<String> spmclientList)
	{
//		HashMap<String, String> sourceMap = new HashMap<String, String>();
//		for (String sourceLine : sourceNameList) {
//			String[] strArr = sourceLine.split("\t", -1);
//			String tmp_source = strArr.length>4?strArr[4]:"";
//			String newKey = tmp_source.equals("")?strArr[3]:strArr[3]+"\t"+tmp_source;
//			sourceMap.put(newKey, sourceLine);
//		}
		HashMap sourceMap = new HashMap();
	    for (String name : sourceNameList) {
	      String[] strArr = name.split("\t", -1);
	      sourceMap.put(strArr[3], name);
	    }
		//联盟的老的字典表
		HashMap<String, String> spmclientMap = new HashMap<String, String>();
		for (String clientspm : spmclientList) {
			String[] strArr = clientspm.split("\t", -1);
			spmclientMap.put(strArr[0], strArr[1]);
		}
		//新的spm字典表
		HashMap<String, String> spmMap = new HashMap<String, String>();
		for (String marktspm : marketSpmList) {
			String[] strArr = marktspm.split("\t", -1);
			if(strArr[2].equals("PC端") && strArr[0].indexOf("b-32948702282246-")==-1 && strArr[0].indexOf("b-12345678901234-")==-1){
				String spmKey = strArr[0]+"."+strArr[1];
				String source1 = strArr[3];
				if(strArr[3].equals("58系PC")){
					source1 = "58系PC站点";
				}
				if(strArr[3].indexOf("付费")!=-1){
					source1 = "广告系列";
				}
				String spmVal = source1+"\t"+strArr[4]+"\t"+strArr[5];
				spmMap.put(spmKey, spmVal);
			}
		}
		String intSourceCode ="其他";

//		String strUrl =trackInfo.getTkUrl();
//		String strDomain ="".equals(trackInfo.getTkRefDomain())?null:trackInfo.getTkRefDomain();
		String strSource = getParameters(strUrl, "utm_source=");
		String strCampaign = getParameters(strUrl, "utm_campaign=");
		String strMedium = getParameters(strUrl, "utm_medium=");
		String strSpm = getParameters(strUrl, "spm=");

		/* 为了减少逻辑判断环节，所以此处的判断为有序判断 */
		//判断顺序改为严格按序执行

		if(null!=strSpm && spmMap.get(strSpm)!=null)
		{
			intSourceCode = spmMap.get(strSpm);
			return intSourceCode;
		}

		for (Map.Entry<String, String> entry : spmclientMap.entrySet()) {
			if(strUrl.contains("spm="+entry.getKey())){
				intSourceCode = "联盟\t" +entry.getValue();
				return intSourceCode;
			}
		}
		if(strSource!=null && strCampaign==null && strSpm==null)
		{
			//判断58系PC站点      ganji   新车促销列表页          ganji_xinche
			intSourceCode = secondWBX(strSource, sourceMap);
		}
		else if (isAD(strUrl, strDomain, strSource, strCampaign, strSpm))
		{

			intSourceCode = "广告系列\t" +secondSourceAD(strUrl, strDomain, strSource, strCampaign, strSpm , sourceMap);
		}
		else if (isSEM(strUrl, strDomain, strSource, strMedium))
		{
			intSourceCode = "SEM\t" +secondSourceSEM(strUrl, strDomain, strSource, strCampaign, strSpm , sourceMap);
		}
		else if (isEDM(strDomain, strSource, strMedium))
		{
			intSourceCode = "EDM";
		}
		else if (isSearch(strDomain, strSource))
		{
			intSourceCode = "SEO\t"+secondSourceSEO(strDomain, strSource);
		}
		else if (isOutside(strDomain, strSource))
		{
			intSourceCode = "站外引荐";
		}
		else if (isInstation(strDomain, strSource))
		{
			intSourceCode = "站内引荐\t"+secondSourceInstation(strDomain, strSource);
		}
		else if (isDirectAccess(strDomain, strSource))
		{
			intSourceCode = "直接访问";
		}

		return intSourceCode;
	}


	public static String getSourceType(ETLTrackBean trackInfo ,List<String> sourceNameList,List<String> marketSpmList,List<String> spmclientList)
	{
		String strUrl =trackInfo.getUrl();
		String strDomain ="".equals(trackInfo.getRefDomain())?null:trackInfo.getRefDomain();
		String intSourceCode = getSource(strUrl, strDomain, sourceNameList,marketSpmList,spmclientList);
		return intSourceCode;
	}



	/*
	 * 直接流量       = 落地页不包含utm_source参数，没有来源域名
	 */
	private static Boolean isDirectAccess(String strDomain, String strSource)
	{
		if (strDomain == null && strSource == null)
			return true;
		else
			return false;
	};


	/*
	 * 广告系列       = 来源域名为www.hao123.com的都是。
     *            或：落地页有utm_source，且utm_source参数值不包含sem-，email，edm的,且有spm或utm_campaign参数。
	 */
	private static Boolean isAD(String strUrl, String strDomain,
			String strSource, String strCampaign, String strSpm)
	{
		if(strDomain != null && strDomain.contains("www.hao123.com"))
		{

			return true;
		}
		if(strSource != null && (strCampaign != null || strSpm != null) && !strSource.contains("sem") && !strSource.contains("email") && !strSource.contains("edm"))
		{
			return true;
		}
		return false;

	};


	/** 1. 广告系列
	 * = 来源域名为www.hao123.com的都是。
	 * 或：落地页有utm_source，且utm_source参数值不包含sem-，email，edm的,且有spm或utm_campaign参数。
	 *
	 * 1.1 utm_source和 utm_campaign都有值时，使用utm_campaign去匹配代码标记1,如果匹配上则向上汇总；
	 * 1.2 utm_source有值和 utm_campaign无值时，使用utm_source去匹配代码标记1,如果匹配上则向上汇总(针对hao123导航)；
	 * 1.3 utm_source和 utm_campaign都无值时，判断域名是否为hao123.com，是则加入广告系列-hao123导航-hao123导航;
	 * 1.4 否则，广告系列-其他
	 */
	private static String secondSourceAD(String strUrl, String strDomain, String strSource, String strCampaign, String strSpm, Map<String, String> sourceMap)
	  {
	    String[] array;
	    String res = "其他";
	    if ((strSource != null) && (strCampaign != null))
	    {
	      if (sourceMap.containsKey(strCampaign))
	      {
	        array = ((String)sourceMap.get(strCampaign)).split("\t", -1);
	        res = array[1] + "\t" + array[2];
	      } else if (sourceMap.containsKey(strSource))
	      {
	        array = ((String)sourceMap.get(strSource)).split("\t", -1);
	        res = array[1] + "\t" + array[2];
	      }
	    }
	    else if ((strSource != null) && (strCampaign == null))
	    {
	      if (sourceMap.containsKey(strSource))
	      {
	        array = ((String)sourceMap.get(strSource)).split("\t", -1);
	        res = array[1] + "\t" + array[2];
	      }

	    }
	    else if ((strDomain != null) && (strDomain.contains("www.hao123.com"))) {
	      res = "hao123导航\thao123导航";
	    }

	    if (res.equals(""))
	    {
	      res = "其他";
	    }
	    return res;
	  }
//	private static String secondSourceAD(String strUrl, String strDomain,
//			String strSource, String strCampaign, String strSpm , Map<String , String> sourceMap)
//	{
//
//		String res= "其他";
//		if(strSource != null && strCampaign != null)
//		{
//			if(sourceMap.containsKey(strCampaign+"\t"+strSource))
//			{
//				String[] array = sourceMap.get(strCampaign+"\t"+strSource).split("\t",-1);
//				res= array[1]+"\t"+array[2];
//			}
////			else if(sourceMap.containsKey(strSource))
////			{
////				String[] array = sourceMap.get(strSource).split("\t",-1);
////				res= array[1]+"\t"+array[2];
////			}
//		}
//		else if(strSource != null && strCampaign==null)
//		{
//			if(sourceMap.containsKey(strSource))
//			{
//				String[] array = sourceMap.get(strSource).split("\t",-1);
//				res= array[1]+"\t"+array[2];
//			}
//		}
//		else{
//			if(strDomain != null && strDomain.contains("www.hao123.com")){
//				res= "hao123导航"+"\t"+"hao123导航";
//			}
//		}
//		if(res.equals(""))
//		{
//			res= "其他";
//		}
//		return res;
//
//	};

	/**
	 * 2、SEM	= 落地页有utm_source参数，且utm_source参数值包含sem的, 有来源域名，且来源域名包含
	 *              （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou ,haosou ,360.com）
	 *
	 * 2.1 使用utm_source去匹配代码标记1(因为SEM的utm_campaign字段对分渠道统计无意义)。
	 * 2.2 否则，SEM-其他-all
	 */
		private static String secondSourceSEM(String strUrl, String strDomain,
				String strSource, String strCampaign, String strSpm , Map<String , String> sourceMap)
		{

			String res= "其他";
			if (sourceMap.containsKey(strSource))
			{
				String[] array = sourceMap.get(strSource).split("\t",-1);
				res= array[1]+"\t"+array[2];
			}
			else
			{
				res= "其他";
			}
			return res;

		}

		//SEO进行来源细分：
		private static String secondSourceSEO(String strDomain,String strSource)
		{
			String semName ="其他";
			String[] arrDomain = {".baidu.com", ".360.cn", ".so.com",".haosou.com",".360.com", ".google.com",
					".sogou.com", ".soso.com", ".bing.com", ".yahoo.cn", ".youdao.com",".ask.com",".easou.com"};

			if (strDomain != null && strSource == null)
			{
				for (String string : arrDomain)
				{
					if (strDomain.contains(string)){
						semName=string.substring(string.indexOf(".")+1,string.lastIndexOf("."));
						semName= semName;
					}
				}
			}
			return semName;
		};

	/*
	 * SEM      = 落地页有utm_source参数，且utm_source参数值包含sem的，有来源域名，且来源域名包含
     *              （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou）
	 *
	 */
	private static Boolean isSEM(String strUrl, String strDomain, String strSource, String strMedium)
	{
		String[] arrDomain = {".baidu.com", ".360.cn", ".so.com",".haosou.com",".360.com", ".google.com",
				".sogou.com", ".soso.com", ".bing.com", ".yahoo.cn", ".youdao.com",".ask.com",".easou.com"};
		if(strDomain == null)
			return false;
		boolean hasDomains = false;

		for (String string : arrDomain)
		{
			if (strDomain.contains(string))
				hasDomains = true;
		}
		if(!hasDomains)
		{
			return false;
		}


		if (strSource != null && strSource.contains("sem") )
		{
			return true;
		}
		return false;
	};





	/*
	 * EDM      = 落地页有utm_source参数，（有或无）utm_medium参数，且utm_source与utm_medium参数任一中包含email,或edm
	 */
	private static Boolean isEDM(String strDomain, String strSource, String strMedium)
	{

		if (strSource != null && (strSource.contains("email") || strSource.contains("edm") || (strMedium != null && (strMedium.contains("email") || strMedium.contains("edm") ) ) ))
		{
			return true;
		}
		return false;
	}




	/*
	 * SEO      = 落地页不包含utm_source参数，有来源域名，且来源域名包含
     *              （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou）
	 */
	private static Boolean isSearch(String strDomain, String strSource)
	{
		String[] arrDomain = {".baidu.com",  ".360.cn", ".so.com",".haosou.com",".360.com",".so.com", ".google.com",
				".sogou.com", ".soso.com", ".bing.com", ".yahoo.cn", ".youdao.com",".ask.com",".easou.com"};

		if (strDomain != null && strSource == null)
		{
			for (String string : arrDomain)
			{
				if (strDomain.contains(string))
					return true;
			}
		}
		return false;
	};



	/*
	 * 站外引荐       = 落地页不包含utm_source参数，有来源域名，来源域名不包含58.com，也不包含
     *             （baidu，360.cn，google，sogou，so，bing，soso，yahoo，youdao，ask，easou）
     *		               或：落地页包含utm_source参数，但不属于上面的SEM，EDM，商务广告的其他所有。
	 */
	private static Boolean isOutside(String strDomain, String strSource)
	{
		String[] arrDomain = {".baidu.com", ".360.cn", ".so.com",".haosou.com",".360.com", ".google.com",
				".sogou.com", ".soso.com", ".bing.com", ".yahoo.cn", ".youdao.com",".ask.com",".easou.com"};
		if (strDomain != null && strSource == null && !strDomain.contains(".58.com"))
		{
			for (String string : arrDomain)
			{
				if (strDomain.contains(string))
					return false;
			}
			return true;
		}
		if(strSource != null)
		{
			return true;
		}
		return false;
	};




	/*
	 * 站内引荐       = 落地页不包含utm_source参数，有来源域名，且来源域名中包含58.com。
	 */
	private static Boolean isInstation(String strDomain, String strSource)
	{
		if (strDomain != null && strSource == null && strDomain.contains(".58.com"))
			return true;
		return false;
	};

	/*
	 * 站内引荐       = 落地页不包含utm_source参数，有来源域名，且来源域名中包含58.com。
	 */
	private static String  secondSourceInstation(String strDomain, String strSource)
	{
		if (strDomain != null && strSource == null && strDomain.contains(".58.com")){
			if(strDomain.contains("sou")){
				return "sou58";
			}
		}
		return "其他";
	};

	/**
	 *
	* secondWBX(判断五八系来源)
	 */
	private static String secondWBX(String strSource,Map<String , String> sourceMap){
		String intSourceCode = "其他";
		if(null !=sourceMap && sourceMap.get(strSource)!=null){
			//判断58系PC站点      ganji   新车促销列表页          ganji_xinche
			String[] array = sourceMap.get(strSource).split("\t", -1);
			intSourceCode = array[0] + "\t" +array[1] + "\t" + array[2];
		}
		return intSourceCode;
	}
}
